package br.unicamp.ft.sahp.model.dao.impl;

import java.util.List;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import br.unicamp.ft.sahp.model.dao.AbstractDAO;
import br.unicamp.ft.sahp.model.dao.TextoDAO;
import br.unicamp.ft.sahp.model.entidades.Texto;
import br.unicamp.ft.sahp.model.exception.TextoNaoEncontradoException;

@Repository
public class TextoDAOImpl extends AbstractDAO<Texto, Long> implements
		TextoDAO {

	@Autowired
	public TextoDAOImpl(
			@Qualifier("entityManagerFactory") EntityManagerFactory factory) {
		super(factory, Texto.class);
	}

	@SuppressWarnings("unchecked")
	public List<Texto> findTextoByParametros(String objetivo, String explicativo, String agradecimento) {
		String consulta = "SELECT texto FROM Texto texto " +
				"WHERE UPPER(texto.textoObjetivo) like UPPER(:textoObjetivo) " +
				"AND UPPER(texto.textoExplicativo) like UPPER(:textoExplicativo) " +
				"AND UPPER(texto.agradecimento) like UPPER(:agradecimento)"; 
		
		Query query = getEntityManager().createQuery(consulta);
		query.setParameter("textoObjetivo", objetivo);
		query.setParameter("textoExplicativo", explicativo);
		query.setParameter("agradecimento", agradecimento);
		
		List<Texto> listaTextos = null;
		listaTextos = query.getResultList();
		
		System.out.println("Achou textos!");
		return listaTextos;
		//return query.getResultList();
	}
	
	public List<Texto> findAllTextos(){
		String consulta = "SELECT texto FROM Texto texto ";
		Query query = getEntityManager().createQuery(consulta);
		return query.getResultList();
		
	}
	
	public Texto findTextoByAvaliacao(Long codigoAvaliacao) throws TextoNaoEncontradoException {
		String consulta = "SELECT texto FROM Texto texto " +
				"WHERE texto.avaliacao.id = :codigoAvaliacao";
		
		Query query = getEntityManager().createQuery(consulta);
		query.setParameter("codigoAvaliacao", codigoAvaliacao);
		
		Texto texto = (Texto) query.getSingleResult();
		
		if (texto == null) {
			throw new TextoNaoEncontradoException();
		}
		
		return texto;
	}
}